package cn.itcast.mq.demo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: ahcfl
 * @Date: 2021年07月18日 23:40
 * @Description:
 */
public class Work1 {
    public static void main(String[] args) {

        // 获得被代理类对象 List的对象
        ArrayList<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("abc");
        list.add("123");
        list.add("abc");
        list.add("abc");
        list.add("World");
        list.add("abc");
        list.add("abc");
        System.out.println("1->"+list);

        // 创建代理类的方法 -》去代理list
        List<String> list1 = proxyMethod(list); // 获取代理类的对象
        list1.remove("abc");  // 使用代理类 拦截重后的remove()方法
        System.out.println("3->"+list1);
    }

    public static List<String> proxyMethod(List<String> list) {
        ClassLoader listLoader = list.getClass().getClassLoader();
        Class<?>[] interfaces = list.getClass().getInterfaces();

        Object obj = Proxy.newProxyInstance(listLoader, interfaces, new InvocationHandler() {
            // 实现InvocationHandler接口 拦截 remove()  方法，进行增强
            // 调用remove(Object obj)方法后  list.add("abc"); 删除所有的"abc"
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // System.out.println(method.getName());
                if ("remove".equals(method.getName())) {
                    // System.out.println(method.getName());
                    // System.out.println(args[0]);
                    for (int i = 0; i < list.size(); i++) {
                        if(args[0] == list.get(i)){
                            System.out.println("-->"+list);
                            list.remove(i);
                            i--;
                        }
                    }
                }

                System.out.println("2->"+list);
                return method.invoke(list, args); // 返回的是处理方法的对象
            }
        });

        System.out.println(obj);
        return (List<String>) obj; // 返回的是代理类的实例对象 --> 代理List集合
    }
}

